<?php
/**
 * 管理端基类
 * 
 * @author:  will.lee <im.will.lee@gmail.com>
 * @version: 1.0
 */
class AdminAction extends AppAction
{
    // 登陆信息
    protected $login_info = false;
    // 允许访问节点
    protected $allow      = array();
    
    /**
     * 管理端初始化方法
     * @access protected
     */
    protected function _initialize()
    {
        // 检查登陆状态
        if(!session('?'.C('ADMIN_SESSION_KEY')))
        {
            $show_info = array
            (
                'url'     => 'Admin/Public/login',
                'message' => '您还没有登陆,请先登陆系统!'
            );
            if(IS_AJAX)
            {
                $this->ajaxFormReturn('登陆超时,请重新登陆!',2);
            }
            else
            {
                $this->error($show_info);
            }
        }
        // 初始化项目设置
        $this->initAdminSetting();
        // 权限验证
        $this->checkAuth();
        parent::_initialize();
    }
    
    /**
     * 初始化项目设置
     * @access private
     */
    private function initAdminSetting()
    {
        // 设置登陆信息
        $this->login_info = session(C('ADMIN_SESSION_KEY'));
        $this->assign('login',$this->login_info);
        // 设置当前域名
        C('FULL_SITE_URL',get_full_site_url());
        // 设置布局模板路径
        if(C('LAYOUT_ON'))
        {
            C('LAYOUT_NAME',TMPL_PATH.'Layouts/admin_layout');
        }
        // 如果是AJAX请求就关闭令牌
        if(IS_AJAX)
        {
            C('TOKEN_ON',false);
        }
    }
    
    /**
     * 管理端分页
     * @access protected
     * @param $count
     * @param $map
     * @param $size
     * @return string
     */
    protected function page($count,$map = array(),$size = 10)
    {
        import('ORG.Util.Page');
        $page    = new Page($count, $size);
        // 分页后保留条件
        if(!empty($map) && is_array($map))
        {
            if(isset($map[C('TOKEN_NAME')]))
            {
                unset($map[C('TOKEN_NAME')]);
            }
            if(isset($map[C('VAR_PAGE')]))
            {
                unset($map[C('VAR_PAGE')]);
            }
            $page->parameter = array_map('urlencode',$map);
        }
        $page->setConfig('theme',' %upPage% %first% %linkPage% %end% %downPage% ');
        $page->setConfig('prev','&laquo;&nbsp;上一页');
        $page->setConfig('next','下一页&nbsp;&raquo;');
        $page->setConfig('first','...');
        $page->setConfig('last','...');
        $this->pageLimit = $page->firstRow . ',' . $page->listRows;
        return $page->show();
    }
    
    /**
     * ajax提交表单返回封装
     * @access protected
     * @param  $message
     * @param  $state
     * @param  $referer
     * @return json string
     */
     protected function ajaxFormReturn($message,$state = 0,$referer = '')
     {
        $state_info = array('fail','success','logout');
        $return = array
        (
            'message' => $message,
            'state'   => $state_info[$state],
            'referer' => $referer
        );
        exit(json_encode($return));
     }
     
    /**
     * 防止数据更新冲突
     * @access protected
     * @param  $model
     * @return void
     */
     protected function checkUpdateConflict($model)
     {
        if(!empty($this->data['_modified_']))
        {
            $pk    = $model->getPk();
            if(!$model->checkUpdateConflict(array($pk=>$this->data[$pk],'modified'=>$this->data['_modified_'])))
            {
                $show_info['message'] = '更新冲突,请刷新页面后重新编辑!';
                if(IS_AJAX)
                {
                    $this->ajaxFormReturn($show_info['message']);
                }
                else
                {
                    $this->error($show_info);
                }
            }
        }
     }
     
    /**
     * 权限验证
     * 
     * @access protected
     */
     protected function checkAuth()
     {
        // 不是超级管理员的情况下
        if($this->login_info['auth'] !='*')
        {
            // 分组
            $g      = GROUP_NAME;
            // 模块
            $m      = MODULE_NAME;
            // 操作
            $a      = ACTION_NAME;
            // 开放当前模块下所有操作
            if($this->allow == '*')
            {
                return true;
            }
            elseif(is_array($this->allow) && in_array($a,$this->allow))
            {
                return true;
            }
            else
            {
                $where = array
                (
                    'g'         => $g,
                    'm'         => $m,
                    'a'         => $a,
                    'root_flg' => array('exp','IS NULL'),
                    'type'     => 1,
                    'root_id'  => array('neq',0),
                );
                $node = D('Node')->field('id')->where($where)->find();
                if(empty($node))
                {
                    if(IS_AJAX)
                    {
                        $this->ajaxFormReturn('该操作节点还未加入系统节点!');
                    }
                    else
                    {
                        $this->error(array('message'=>'该操作节点还未加入系统节点!'));
                    }
                }
                else
                {
                    if(!in_array($node['id'],$this->login_info['auth']))
                    {
                        if(IS_AJAX)
                        {
                            $this->ajaxFormReturn('您的账号角色没有访问该节点的权限!');
                        }
                        else
                        {
                            $this->error(array('message'=>'您的账号角色没有访问该节点的权限!'));
                        }
                    }
                }
            }
        }
     }
}